Carrier Intelligence That Drives Decisions

Every metric sourced from SERFF filings and SEC EDGAR. No estimates, no stale data.

{[ {t:"DWP & Financial Performance",d:"Direct written premium, loss ratios, and combined ratios from SEC EDGAR 10-K/10-Q filings for 65+ public carriers plus major mutuals.",c:"#059669"}, {t:"Filing Intelligence by State",d:"Approval rates, regulatory friction index, filing type mix, and disposition patterns across all 49 SERFF states. Know which states push back.",c:"#2563eb"}, {t:"Carrier Competitive Analysis",d:"Filing intensity, LOB diversification, state concentration, and peer benchmarking. See how carriers position against competitors.",c:"#7c3aed"}, {t:"Regulatory Friction Scoring",d:"Quantified rejection and withdrawal rates by state. VT and CA run 30%+ friction — critical intel for filing strategy.",c:"#dc2626"}, {t:"State x LOB Approval Heatmaps",d:"Granular approval rates broken down by state and line of business. Spot where regulators are tightening or easing.",c:"#d97706"}, {t:"Filing Document Access",d:"Direct PDF downloads of actual SERFF filing documents. Rate filings, form filings, and actuarial exhibits.",c:"#0891b2"}, ].map(f=>

{f.t}

{f.d}

)}

Ready to stop searching manually?

Join insurance professionals who save hours every week with AI-powered filing intelligence.

)} function Res({res,q,ds,nav,csv,ld,fSt,setFSt,fSs,setFSs,fLb,setFLb,fTy,setFTy,fCr,setFCr,fDr,setFDr,allSt,sel,setSel,cp,setCp}){ const pp=20; const[localQ,setLocalQ]=React.useState(q); React.useEffect(()=>setLocalQ(q),[q]); const filt=React.useMemo(()=>{if(!res||!res.results)return[];let r=res.results; if(fSt.length)r=r.filter(f=>fSt.includes(f.state));if(fSs.length)r=r.filter(f=>fSs.some(s=>f.status&&f.status.toLowerCase().includes(s.toLowerCase()))); if(fLb.length)r=r.filter(f=>fLb.includes(cLOB(f.line_of_business)));if(fTy.length)r=r.filter(f=>fTy.includes(f.filing_type)); if(fCr.length)r=r.filter(f=>fCr.includes(f.carrier));return r},[res,fSt,fSs,fLb,fTy,fCr]); const tp=Math.ceil(filt.length/pp);const pr=filt.slice(cp*pp,(cp+1)*pp); const uSs=React.useMemo(()=>res&&res.results?[...new Set(res.results.map(f=>f.status).filter(Boolean))].sort():[],[res]); const uTy=React.useMemo(()=>res&&res.results?[...new Set(res.results.map(f=>f.filing_type).filter(Boolean))].sort():[],[res]); const uLb=React.useMemo(()=>res&&res.results?[...new Set(res.results.map(f=>cLOB(f.line_of_business)))].sort():[],[res]); const uCr=React.useMemo(()=>res&&res.results?[...new Set(res.results.map(f=>f.carrier).filter(Boolean))].sort():[],[res]); const af=fSt.length+fSs.length+fLb.length+fTy.length+fCr.length+(fDr!==365?1:0); return(
{ld?
{[1,2,3].map(i=>
)}
:(res&&res.total&&res.results&&res.total>res.results.length?filt.length.toLocaleString()+" results (of "+res.total.toLocaleString()+" total — add filters to narrow)":filt.length.toLocaleString()+" results")}
setLocalQ(e.target.value)} onKeyDown={e=>{if(e.key==="Enter"&&localQ.trim())ds(localQ)}} placeholder="Refine search..."/>
Filters: {setFSt(v);setCp(0)}}/> {setFSs(v);setCp(0)}}/> {setFLb(v);setCp(0)}}/> {setFTy(v);setCp(0)}}/>
Carriers: {setFCr(v);setCp(0)}} allCarriers={uCr}/> {af>0&&}
{pr.map(f=>{const lb=cLOB(f.line_of_business);const sc=stColor(f.status);return(
setSel(f)}>
{e.stopPropagation();window.dispatchEvent(new CustomEvent("openCarrier",{detail:f.carrier}))}} style={{cursor:"pointer"}}>{f.carrier}{f.status}
{f.state}{lb}{f.filing_type}Filed: {f.filing_date}
{f.rate_change_selected&&
0?"var(--red-bg)":"var(--green-bg)",color:f.rate_change_selected>0?"var(--red)":"var(--green)"}}>{f.rate_change_selected>0?"+":""}{f.rate_change_selected}%{f.loss_ratio&&LR: {f.loss_ratio}%}
}
{f.filing_number}
View →
)})} {tp>1&&
{Array.from({length:Math.min(tp,10)},(_,i)=>{let p;if(tp<=10)p=i;else if(cp<5)p=i;else if(cp>tp-6)p=tp-10+i;else p=cp-4+i;return})} {tp>10&&of {tp}}
} {filt.length===0&&!ld&&
🔍
No filings found
Try adjusting your search terms or filters. You can search by carrier name, state, line of business, or filing type.
}
{sel&&
setSel(null)}>
e.stopPropagation()}>

{sel.carrier}

{sel.status}
Filing Number{sel.filing_number}
State{sel.state}
Line of Business{cLOB(sel.line_of_business)} ({sel.line_of_business})
Filing Type{sel.filing_type}
Filing Date{sel.filing_date}
Effective Date{sel.effective_date||"N/A"}
{sel.rate_change_selected&&

Rate Change Analysis

{sel.rate_change_indicated&&
Indicated
{sel.rate_change_indicated>0?"+":""}{sel.rate_change_indicated}%
}
Selected
0?"var(--red)":"var(--green)"}}>{sel.rate_change_selected>0?"+":""}{sel.rate_change_selected}%
{sel.loss_ratio&&
Loss Ratio
{sel.loss_ratio}%
}
} {sel.ai_summary&&

AI Summary

{sel.ai_summary}

} {sel.ai_insight&&

AI Insight

{sel.ai_insight}

} {sel.key_drivers&&sel.key_drivers.length>0&&

Key Drivers

{sel.key_drivers.map(d=>{d})}
} {sel.territory_changes&&sel.territory_changes.length>0&&

Territory Changes

{sel.territory_changes.map(t=>
{t.name}0?"var(--red)":"var(--green)"}}>{t.change>0?"+":""}{t.change}%
)}
} {sel.actuarial_methods&&sel.actuarial_methods.length>0&&

Actuarial Methods

{sel.actuarial_methods.map(m=>{m})}
} {sel.rating_changes&&sel.rating_changes.length>0&&

Rating Factor Changes

{sel.rating_changes.map((rc,i)=>
{rc.factor||rc.name}0?"var(--red)":"var(--green)"}}>{(rc.change||rc.impact)>0?"+":""}{rc.change||rc.impact}%
)}
} {sel.catastrophe_model&&

Catastrophe Model

{typeof sel.catastrophe_model==="string"?sel.catastrophe_model:sel.catastrophe_model.description||JSON.stringify(sel.catastrophe_model)}

{sel.catastrophe_model.vendor&&

Vendor: {sel.catastrophe_model.vendor}

}
}

Find Filing Documents

Links open SERFF Filing Access search and the {sel.state} Department of Insurance website directly. Web search finds the filing number across public DOI records and insurance databases.

}
)} function fmtMonth(ym){const[y,m]=ym.split("-");const mn=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];return mn[+m-1]+" "+y.slice(2);} function TrendChart({trends}){ const ref=React.useRef(null);const chart=React.useRef(null); React.useEffect(()=>{ if(!trends||!trends.by_month||!ref.current)return; if(chart.current){chart.current.destroy();chart.current=null;} const months=trends.by_month.filter(x=>x.count>0); if(!months.length)return; const labels=months.map(x=>fmtMonth(x.month)); const counts=months.map(x=>x.count); const rateFilings=months.map(x=>x.rate_filings); chart.current=new Chart(ref.current,{ type:"line", data:{ labels, datasets:[ {label:"Total Filings",data:counts,borderColor:"#2563eb",backgroundColor:"rgba(37,99,235,0.08)",borderWidth:2,fill:true,tension:0.3,pointRadius:3,pointHoverRadius:6}, {label:"Rate-Bearing Filings",data:rateFilings,borderColor:"#059669",backgroundColor:"rgba(5,150,105,0.08)",borderWidth:2,fill:true,tension:0.3,pointRadius:2,pointHoverRadius:5}, ] }, options:{ responsive:true,maintainAspectRatio:false, interaction:{mode:"index",intersect:false}, plugins:{ legend:{position:"top",labels:{font:{family:"DM Sans",size:12},boxWidth:14,padding:12,usePointStyle:true}}, tooltip:{ backgroundColor:"rgba(255,255,255,0.96)",titleColor:"#0f172a",bodyColor:"#475569",borderColor:"#e2e8f0",borderWidth:1,padding:12, callbacks:{ afterBody:(items)=>{ const i=items[0].dataIndex; if(months[i]){ const rc=months[i].avg_rate_change; if(rc!=null)return["Avg rate chg: "+(rc>0?"+":"")+rc+"%"]; } return[]; } } } }, scales:{ x:{grid:{color:"rgba(0,0,0,0.04)"},ticks:{font:{family:"DM Sans",size:11},maxRotation:45}}, y:{grid:{color:"rgba(0,0,0,0.04)"},ticks:{font:{family:"DM Sans",size:11}},beginAtZero:false} } } }); return()=>{if(chart.current){chart.current.destroy();chart.current=null;}}; },[trends]); return ; } function LobDonut({summary,activeLob,onToggle}){ const ref=React.useRef(null);const chart=React.useRef(null); React.useEffect(()=>{ if(!summary||!ref.current)return; if(chart.current){chart.current.destroy();chart.current=null;} const top=summary.by_lob.slice(0,8); const other=summary.by_lob.slice(8).reduce((s,x)=>s+x.count,0); if(other>0)top.push({name:"Other",count:other}); const bg=["#2563eb","#7c3aed","#059669","#d97706","#dc2626","#0891b2","#4f46e5","#c026d3","#0d9488","#94a3b8"]; chart.current=new Chart(ref.current,{ type:"doughnut", data:{ labels:top.map(x=>x.name), datasets:[{data:top.map(x=>x.count),backgroundColor:bg,borderWidth:2,borderColor:"#fff",hoverOffset:6}] }, options:{ responsive:true,maintainAspectRatio:false,cutout:"62%", onClick:(_,els)=>{if(els.length>0&&top[els[0].index].name!=="Other")onToggle(top[els[0].index].name);}, plugins:{ legend:{position:"right",labels:{font:{family:"DM Sans",size:11},boxWidth:12,padding:6,usePointStyle:true}}, tooltip:{ backgroundColor:"rgba(255,255,255,0.96)",titleColor:"#0f172a",bodyColor:"#475569",borderColor:"#e2e8f0",borderWidth:1,padding:10, callbacks:{label:(ctx)=>`${ctx.label}: ${ctx.raw.toLocaleString()} (${Math.round(ctx.raw/summary.total*100)}%)`} } } } }); return()=>{if(chart.current){chart.current.destroy();chart.current=null;}}; },[summary]); return ; } function KpiCard({label,value,sub,trend,color,tooltip}){ const[hover,setHover]=React.useState(false); const trendColor=trend==="up"?"var(--green)":trend==="down"?"var(--red)":"var(--text3)"; const trendArrow=trend==="up"?"\u2191":trend==="down"?"\u2193":"\u2194"; return(
setHover(true)} onMouseLeave={()=>setHover(false)}> {hover&&tooltip&&
{tooltip}
}
{label}
{value}
{trend&&{trendArrow}} {sub}
); } const STATE_INFO={ AL:{name:"Alabama",sys:"Prior Approval",note:"Personal and commercial lines require DOI approval before use. Moderate regulatory friction with focus on coastal property adequacy."}, AK:{name:"Alaska",sys:"File & Use",note:"Small market with unique geographic risks. File-and-use allows fast deployment. Limited competition due to isolation."}, AZ:{name:"Arizona",sys:"File & Use",note:"Fast-growing Sun Belt market. File-and-use for most lines. Active auto and homeowners markets driven by population growth."}, AR:{name:"Arkansas",sys:"Prior Approval",note:"Prior approval for personal lines. Moderate filing volume. Tornado corridor drives property activity."}, CA:{name:"California",sys:"Prior Approval (Prop 103)",note:"Rate increases require actuarial justification and public hearings. Consumer advocacy groups routinely intervene. Plan for 6–18 month approval timelines for significant changes. Wildfire exposure has made homeowners one of the most active and scrutinized lines."}, CO:{name:"Colorado",sys:"File & Use",note:"Rapidly growing market. File-and-use allows quick deployment. Severe hail exposure and wildfire risk drive high property filing activity."}, CT:{name:"Connecticut",sys:"Prior Approval",note:"Prior approval for personal lines. Dense suburban market. Financial guaranty and specialty professional liability active."}, DE:{name:"Delaware",sys:"File & Use",note:"Small market but significant surplus lines activity due to corporate domicile laws. Important captive insurance hub for large groups."}, FL:{name:"Florida",sys:"Prior Approval (Property)",note:"One of the most complex insurance markets nationally. Citizens Property Insurance creates unique market dynamics. CAT exposure requires detailed hurricane models. Non-admitted market is highly active. Homeowners filings face intense regulatory scrutiny."}, GA:{name:"Georgia",sys:"File & Use",note:"Large and growing market. File-and-use with informational filing requirements. Active auto and commercial lines. Atlanta drives significant GL and professional liability activity."}, HI:{name:"Hawaii",sys:"Prior Approval",note:"Small island market with mandatory prior approval. No-fault auto system. Limited competition across most lines. Unique geographic risks including volcanic activity."}, ID:{name:"Idaho",sys:"Prior Approval",note:"Prior approval required. Rural market with farm and agricultural insurance prominent. Growing residential market in Boise metro."}, IL:{name:"Illinois",sys:"Prior Approval",note:"Large commercial market centered on Chicago. Prior approval for personal lines. Significant GL, professional liability, and D&O filing activity. High litigation environment."}, IN:{name:"Indiana",sys:"Prior Approval",note:"Prior approval for personal lines. Significant manufacturing sector drives commercial insurance activity. Moderate regulatory friction."}, IA:{name:"Iowa",sys:"Prior Approval",note:"Agricultural state with heavy farm, crop, and livestock insurance filings. Prior approval system with focus on agricultural line adequacy."}, KS:{name:"Kansas",sys:"Prior Approval",note:"Tornado corridor drives heavy property filing activity. Prior approval with rigorous loss cost projection review. Wind/hail exclusions common."}, KY:{name:"Kentucky",sys:"Prior Approval",note:"Prior approval for personal auto and homeowners. Coal industry historically drives workers comp activity. Moderate overall market."}, LA:{name:"Louisiana",sys:"Prior Approval",note:"High-friction market. Hurricane and flood exposure creates significant property challenges. Active DOI oversight. Citizens-equivalent program affects market dynamics. Budget extended timelines."}, ME:{name:"Maine",sys:"Prior Approval",note:"Prior approval for personal lines. Small market with active homeowners segment due to coastal exposure. Limited carrier competition."}, MD:{name:"Maryland",sys:"Prior Approval",note:"Mixed system — personal lines prior approval, commercial file-and-use. Proximity to DC drives professional and management liability markets."}, MA:{name:"Massachusetts",sys:"Prior Approval",note:"Strict prior approval across most lines. Auto insurance underwent managed competition reform. High regulatory scrutiny with active consumer advocacy. Plan for extended approval windows."}, MI:{name:"Michigan",sys:"File & Use",note:"Unique no-fault auto system undergoing ongoing reform. Historically high auto insurance costs. File-and-use for most lines outside of auto rate parameters."}, MN:{name:"Minnesota",sys:"File & Use",note:"File-and-use with post-filing review capabilities. Active workers comp and commercial markets. Moderate regulatory friction."}, MS:{name:"Mississippi",sys:"Prior Approval",note:"Prior approval required. Hurricane and coastal exposure significantly affects property market. Low density market with limited carrier options."}, MO:{name:"Missouri",sys:"File & Use",note:"Large commercial market. File-and-use with periodic rate review. Active tornado corridor property market. Significant commercial auto activity."}, MT:{name:"Montana",sys:"File & Use",note:"Rural market with agricultural insurance prominent. File-and-use with limited regulatory staff. Low filing volume overall."}, NE:{name:"Nebraska",sys:"File & Use",note:"Agricultural state with tornado/hail exposure driving property filings. File-and-use system with light regulatory touch."}, NV:{name:"Nevada",sys:"File & Use",note:"Competitive market. Tourism and hospitality sectors drive specialty GL filings. File-and-use allows rapid product innovation."}, NH:{name:"New Hampshire",sys:"File & Use",note:"Small market with no income tax environment. File-and-use for most lines. Limited population size keeps overall volume modest."}, NJ:{name:"New Jersey",sys:"Prior Approval",note:"One of the most difficult personal auto markets nationally. Prior approval with extensive documentation requirements. High litigation costs and extensive rate support expected. Consumer advocacy active."}, NM:{name:"New Mexico",sys:"Prior Approval",note:"Prior approval required. Small market with active oil & gas industry driving commercial insurance filings. Workers comp and GL prominent."}, NY:{name:"New York",sys:"Prior Approval",note:"Stringent DFS oversight. Consumer advocacy groups frequently intervene in rate proceedings. Detailed regulatory justifications required. One of the hardest approval environments nationally — budget 6–12 months for significant changes."}, NC:{name:"North Carolina",sys:"Bureau (Prior Approval)",note:"Rate Bureau system for auto and property — the Commissioner sets rates for insurers. Unusual regulatory structure focused on market stability. Independent filings require strong justification departing from bureau rates."}, ND:{name:"North Dakota",sys:"Prior Approval",note:"State-operated workers compensation (exclusive state fund). Small private market for other lines. Low overall filing volume."}, OH:{name:"Ohio",sys:"Use & File",note:"Leads national filing volume. Use-and-file allows rapid market deployment. Strong leading indicator for national market repricing trends. Reliable benchmark state."}, OK:{name:"Oklahoma",sys:"File & Use",note:"High tornado and weather exposure drives significant property filings. File-and-use with moderate DOI oversight. Active commercial lines market."}, OR:{name:"Oregon",sys:"Prior Approval",note:"Prior approval for personal lines. Environmental liability and technology sectors active. Progressive regulatory environment with strong consumer protections."}, PA:{name:"Pennsylvania",sys:"Prior Approval",note:"Prior approval for personal lines. Large commercial market with significant workers comp and GL activity. Typical approval window 60–90 days. Active rate filing market."}, RI:{name:"Rhode Island",sys:"Prior Approval",note:"Small market with prior approval requirements. Manufacturing heritage drives commercial lines activity. High cost of living reflects in personal lines premiums."}, SC:{name:"South Carolina",sys:"Prior Approval",note:"Prior approval for personal lines. Growing coastal market with active homeowners segment. Beach and Wind Pool affects coastal property dynamics."}, SD:{name:"South Dakota",sys:"File & Use",note:"Small market with agricultural and rural focus. File-and-use with minimal regulatory friction. Low overall filing volume."}, TN:{name:"Tennessee",sys:"Prior Approval",note:"Prior approval for personal lines. Growing market with active commercial auto and GL. Nashville growth driving increased filing activity."}, TX:{name:"Texas",sys:"File & Use",note:"Second largest insurance market nationally. File-and-use allows fast deployment. High hail, hurricane, and severe weather exposure drives heavy property filing activity. Strong bellwether for national pricing trends across all lines."}, UT:{name:"Utah",sys:"File & Use",note:"Fast-growing market driven by population influx. Homeowners and personal auto most active. File-and-use enables rapid product launches."}, VT:{name:"Vermont",sys:"Prior Approval",note:"Small market with active captive insurance industry. Prior approval for admitted market personal lines. Strong regulatory expertise in alternative risk."}, VA:{name:"Virginia",sys:"File & Use",note:"File-and-use system. Large federal government employment base drives benefits and professional liability. Growing Northern Virginia tech corridor increases cyber and D&O activity."}, WA:{name:"Washington",sys:"Prior Approval",note:"Prior approval for personal lines. Active environmental and technology liability markets. High regulatory engagement with detailed rate support expectations."}, WV:{name:"West Virginia",sys:"Prior Approval",note:"Prior approval required. Historically coal industry influences workers comp market. Small overall market with limited competition."}, WI:{name:"Wisconsin",sys:"File & Use",note:"File-and-use with active regulatory review capability. Large commercial market, particularly manufacturing and farm-related lines. Generally moderate regulatory environment."}, WY:{name:"Wyoming",sys:"File & Use",note:"Smallest market nationally. Oil & gas industry influence on commercial lines. File-and-use with minimal regulatory friction."}, DC:{name:"Washington D.C.",sys:"Prior Approval",note:"Small but specialized market. Federal government influence drives professional and management liability. Prior approval with active consumer protection focus."} }; const ALL_STATES=["AL","AK","AZ","AR","CA","CO","CT","DE","FL","GA","HI","ID","IL","IN","IA","KS","KY","LA","ME","MD","MA","MI","MN","MS","MO","MT","NE","NV","NH","NJ","NM","NY","NC","ND","OH","OK","OR","PA","RI","SC","SD","TN","TX","UT","VT","VA","WA","WV","WI","WY","DC"]; function StatePage({abbr,onBack,ds}){ const info=STATE_INFO[abbr]||{name:abbr,sys:"Unknown",note:""}; const[summ,setSumm]=React.useState(null); const[filings,setFilings]=React.useState([]); const[loading,setLoading]=React.useState(true); const[fDays,setFDays]=React.useState(9999); const[fStatus,setFStatus]=React.useState(""); const[fType,setFType]=React.useState(""); const[fQ,setFQ]=React.useState(""); const[page,setPage]=React.useState(0); React.useEffect(()=>{ setLoading(true); Promise.all([ fetch(API+"/api/v1/analytics/summary?state="+abbr+"&days=9999").then(r=>r.json()), fetch(API+"/api/v1/filings?state="+abbr+"&days=9999&limit=200").then(r=>r.json()) ]).then(([s,f])=>{setSumm(s);setFilings(f.results||[]);setLoading(false);}).catch(()=>setLoading(false)); },[abbr]); const filtered=React.useMemo(()=>{ let r=filings; if(fStatus)r=r.filter(f=>f.status&&f.status.toLowerCase().includes(fStatus.toLowerCase())); if(fType)r=r.filter(f=>f.filing_type&&f.filing_type.toLowerCase().includes(fType.toLowerCase())); if(fQ)r=r.filter(f=>{const s=(f.carrier+" "+f.line_of_business+" "+f.filing_type+" "+f.status).toLowerCase();return s.includes(fQ.toLowerCase());}); return r; },[filings,fStatus,fType,fQ]); const pp=20;const tp=Math.ceil(filtered.length/pp);const pr=filtered.slice(page*pp,(page+1)*pp); const kpis=React.useMemo(()=>{ if(!summ)return[]; const t=summ.total; const appr=(summ.by_status.find(x=>x.name==="Approved")||{count:0}).count; const rej=(summ.by_status.find(x=>x.name==="Rejected/Disapproved")||{count:0}).count; const rev=(summ.by_status.find(x=>x.name==="Under Review")||{count:0}).count; const apprPct=t?Math.round(appr/t*100):0; const rejPct=t?Math.round(rej/t*100):0; const revPct=t?Math.round(rev/t*100):0; const topLob=summ.by_lob[0]; const carriers=summ.by_carrier.length; return[ {k:"Total Filings",v:t.toLocaleString(),sub:"all time"}, {k:"Carriers Active",v:carriers,sub:"unique filers"}, {k:"Top Line",v:topLob?topLob.name.split("/")[0]:"—",sub:topLob?Math.round(topLob.count/t*100)+"% of filings":""}, {k:"Approval Rate",v:apprPct+"%",c:apprPct>=60?"#059669":apprPct>=40?"#d97706":"#dc2626",sub:appr.toLocaleString()+" approved"}, {k:"Rejection Rate",v:rejPct+"%",c:rejPct>8?"#dc2626":"#475569",sub:rej.toLocaleString()+" rejected"}, {k:"Under Review",v:revPct+"%",c:revPct>25?"#d97706":"#475569",sub:rev.toLocaleString()+" pending"}, ]; },[summ]); const overview=React.useMemo(()=>{ if(!summ||!summ.total)return[]; const t=summ.total; const appr=(summ.by_status.find(x=>x.name==="Approved")||{count:0}).count; const rej=(summ.by_status.find(x=>x.name==="Rejected/Disapproved")||{count:0}).count; const rev=(summ.by_status.find(x=>x.name==="Under Review")||{count:0}).count; const apprPct=t?Math.round(appr/t*100):0; const rejPct=t?Math.round(rej/t*100):0; const revPct=t?Math.round(rev/t*100):0; const topLob=summ.by_lob[0];const topCar=summ.by_carrier[0]; const parts=[]; parts.push({icon:"🏛️",text:`${info.name} operates under a **${info.sys}** regulatory framework. ${info.note}`}); if(topLob){ const lobPct=Math.round(topLob.count/t*100); parts.push({icon:"📊",text:`**${topLob.name}** leads filing activity at ${lobPct}% of all ${abbr} filings (${topLob.count.toLocaleString()} total). ${lobPct>30?"This dominant concentration signals where regulatory strategy attention is most needed.":"Filing activity is diversified across multiple lines."}`}); } const climate=apprPct>=65?"**favorable regulatory climate** — filings are generally approved efficiently, making "+abbr+" a good jurisdiction for new product introductions and rate adequacy filings.":apprPct>=40?"**moderate regulatory environment** — solid actuarial justification is expected, but approvals proceed at a reasonable pace.":"**high-friction regulatory environment** — expect detailed scrutiny, public comment periods, and extended review timelines. Strong actuarial support and pre-filing DOI consultation are recommended."; parts.push({icon:"⚖️",text:`With a **${apprPct}% approval rate** and **${rejPct}% rejection rate**, ${abbr} presents a ${climate}`}); if(revPct>20){ parts.push({icon:"⏳",text:`**${revPct}% of filings remain under DOI review**, indicating a processing backlog. Actuaries and regulatory teams should plan for extended timelines and proactive follow-up with the DOI.`}); } if(topCar){ parts.push({icon:"🏢",text:`**${topCar.name}** is the most active carrier in ${abbr} with ${topCar.count} filings — ${Math.round(topCar.count/t*100)}% of total market filing activity.`}); } return parts; },[summ,info,abbr]); const sysColor=info.sys.includes("Prior")?"#dc2626":info.sys.includes("Use & File")||info.sys.includes("File & Use")?"#059669":"#d97706"; const statuses=[...new Set(filings.map(f=>f.status).filter(Boolean))].sort(); const types=[...new Set(filings.map(f=>f.filing_type).filter(Boolean))].sort(); return(
{abbr}
{info.name}
Insurance Regulatory Intelligence
{info.sys}
{loading&&
Loading {abbr} data…
} {!loading&&summ&&
{kpis.map((k,i)=>
{k.k}
{k.v}
{k.sub}
)}
AI Regulatory Overview
{overview.map((p,i)=>
{p.icon}
$1")}}/>
)}
Status Distribution
{(summ.by_status||[]).slice(0,6).map((x,i)=>{ const SCOLS={"Approved":"#059669","Filed/Acknowledged":"#2563eb","Under Review":"#d97706","Rejected/Disapproved":"#dc2626","Withdrawn":"#94a3b8","Closed - Other":"#64748b","Open/Response Needed":"#0891b2","Other":"#cbd5e1"}; const c=SCOLS[x.name]||"#94a3b8";const pct=Math.round(x.count/summ.total*100); return
{x.name}
{pct}%
; })}
Top Lines of Business
{(summ.by_lob||[]).slice(0,6).map((x,i)=>{ const LCOLS=["#7c3aed","#2563eb","#059669","#d97706","#dc2626","#0891b2"]; const pct=Math.round(x.count/summ.total*100); return
{x.name}
{pct}%
; })}
Top Carriers in {abbr}
{(summ.by_carrier||[]).slice(0,6).map((x,i)=>
{i+1} {x.name} {x.count}
)}
Filings
{setFQ(e.target.value);setPage(0)}} placeholder="Search carrier, LOB, type..." style={{padding:"6px 12px",borderRadius:6,border:"1px solid #e2e8f0",fontSize:12,fontFamily:"inherit",outline:"none",width:220}}/> {filtered.length.toLocaleString()} filings
{["Carrier","LOB","Type","Status","Filed","Rate Chg"].map(h=>)} {pr.map(f=>{ const sc={Approved:{b:"#d1fae5",c:"#065f46"},"Filed/Acknowledged":{b:"#dbeafe",c:"#1e40af"},"Under Review":{b:"#fef3c7",c:"#92400e"},"Rejected/Disapproved":{b:"#fee2e2",c:"#991b1b"},Withdrawn:{b:"#f1f5f9",c:"#64748b"}}[f.status]||{b:"#f1f5f9",c:"#64748b"}; return window.open(f.serff_url||getSerffSearchUrl(f.state,f.filing_number,f.carrier),"_blank")}> ; })}
{h}
{f.carrier} {f.line_of_business} {f.filing_type} {f.status} {f.filing_date} 0?"#dc2626":f.rate_change_selected<0?"#059669":"#94a3b8",fontWeight:600}}>{f.rate_change_selected!=null?(f.rate_change_selected>0?"+":"")+f.rate_change_selected+"%":"—"}
{tp>1&&
Page {page+1} of {tp}
}
}
); } function CarrierDirectory({carriers,onSelect,ds}){ const[data,setData]=React.useState(null); const[loading,setLoading]=React.useState(true); const[search,setSearch]=React.useState(""); const[sort,setSort]=React.useState("filings"); const[topCollapsed,setTopCollapsed]=React.useState(false); React.useEffect(()=>{ fetch(API+"/api/v1/carriers/list") .then(r=>r.json()).then(d=>{setData(d);setLoading(false);}) .catch(()=>setLoading(false)); },[]); const sorted=React.useMemo(()=>{ if(!data||!data.length)return[]; return[...data].sort((a,b)=>b.total-a.total); },[data]); const top25=React.useMemo(()=>sorted.slice(0,25),[sorted]); const list=React.useMemo(()=>{ if(!data||!data.length)return[]; let r=data; if(search){ const s=search.toLowerCase(); r=r.filter(c=>c.carrier.toLowerCase().includes(s)||(c.group&&c.group.toLowerCase().includes(s))); } if(sort==="filings")r=[...r].sort((a,b)=>b.total-a.total); else if(sort==="states")r=[...r].sort((a,b)=>b.states-a.states); else if(sort==="name")r=[...r].sort((a,b)=>(a.group||a.carrier).localeCompare(b.group||b.carrier)); return r; },[data,search,sort]); const getInitials=(name)=>{ const words=name.replace(/[^a-zA-Z\s]/g,'').split(/\s+/).filter(Boolean); return words.map(w=>w[0]).join('').slice(0,3).toUpperCase(); }; const avatarColors=[ 'linear-gradient(135deg,#7c3aed,#2563eb)', 'linear-gradient(135deg,#2563eb,#059669)', 'linear-gradient(135deg,#dc2626,#d97706)', 'linear-gradient(135deg,#7c3aed,#dc2626)', 'linear-gradient(135deg,#059669,#2563eb)', 'linear-gradient(135deg,#d97706,#7c3aed)', ]; const getAvatarBg=(name)=>avatarColors[Math.abs([...name].reduce((a,c)=>a+c.charCodeAt(0),0))%avatarColors.length]; const openCarrier=(c)=>{ window.dispatchEvent(new CustomEvent("openCarrier",{detail:c.carrier})); }; if(loading)return(
Loading carriers...
); return(
{/* Section 1: Top 25 by Filings */}
setTopCollapsed(!topCollapsed)} >
Top 25 Carriers by Filings {topCollapsed?"":"(scroll \u2192)"}
{!topCollapsed&&(
{top25.map((c,i)=>{ const initials=getInitials(c.group||c.carrier); const displayName=c.group||c.carrier; return(
openCarrier(c)} style={{ minWidth:120,maxWidth:120,background:"#fff",borderRadius:8,border:"1px solid #e2e8f0", padding:"8px 8px 6px",cursor:"pointer",display:"flex",flexDirection:"column", alignItems:"center",gap:3,flexShrink:0,transition:"all 0.15s",position:"relative" }} onMouseEnter={e=>{e.currentTarget.style.borderColor="#2563eb";e.currentTarget.style.boxShadow="0 2px 8px rgba(37,99,235,0.12)"}} onMouseLeave={e=>{e.currentTarget.style.borderColor="#e2e8f0";e.currentTarget.style.boxShadow="none"}} >
{i+1}
{initials}
{displayName}
{c.total}
filings
{c.states} state{c.states!==1?"s":""}
); })}
)}
{/* Section 2: All Carriers */}
All Carriers {list.length} setSearch(e.target.value)} placeholder="Search carriers..." style={{marginLeft:"auto",padding:"6px 12px",borderRadius:8,border:"1px solid #e2e8f0",fontSize:12,width:220,outline:"none",fontFamily:"inherit"}} />
{list.map(c=>{ const initials=getInitials(c.group||c.carrier); const displayName=c.group||c.carrier; return(
openCarrier(c)} style={{ background:"#fff",borderRadius:8,border:"1px solid #e2e8f0", padding:"10px 12px",cursor:"pointer",transition:"all 0.15s", display:"flex",gap:10,alignItems:"center" }} onMouseEnter={e=>{e.currentTarget.style.borderColor="#2563eb";e.currentTarget.style.boxShadow="0 2px 8px rgba(37,99,235,0.1)"}} onMouseLeave={e=>{e.currentTarget.style.borderColor="#e2e8f0";e.currentTarget.style.boxShadow="none"}} >
{initials}
{displayName}
{c.total} filings {c.states} state{c.states!==1?"s":""} {c.entities>1&&{c.entities} entities}
{c.total}
filings
); })}
); } function _stColor(s){if(!s)return{b:'#f1f5f9',c:'#64748b'};var l=s.toLowerCase();if(l.indexOf('approved')>=0||l.indexOf('proper')>=0)return{b:'#d1fae5',c:'#065f46'};if(l.indexOf('filed')>=0||l.indexOf('accepted')>=0||l.indexOf('acknowledged')>=0)return{b:'#dbeafe',c:'#1e40af'};if(l.indexOf('pending')>=0||l.indexOf('review')>=0||l.indexOf('submitted')>=0||l.indexOf('assigned')>=0||l.indexOf('intake')>=0)return{b:'#fef3c7',c:'#92400e'};if(l.indexOf('reject')>=0||l.indexOf('disapprov')>=0)return{b:'#fee2e2',c:'#991b1b'};if(l.indexOf('withdrawn')>=0)return{b:'#f1f5f9',c:'#64748b'};return{b:'#f1f5f9',c:'#64748b'};} function CarrierPage({carrier,onBack,ds}){ const [profile,setProfile]=React.useState(null); const [finData,setFinData]=React.useState(null); const [frictionData,setFrictionData]=React.useState(null); const [loading,setLoading]=React.useState(true); const [selFiling,setSelFiling]=React.useState(null); React.useEffect(()=>{ setLoading(true); Promise.all([ fetch(`${API}/api/v1/carriers/${encodeURIComponent(carrier)}/profile`).then(r=>r.json()), fetch(`${API}/api/v1/carriers/${encodeURIComponent(carrier)}/financials`).then(r=>r.json()), fetch(`${API}/api/v1/analytics/friction?days=9999`).then(r=>r.json()) ]).then(([p,f,fr])=>{ setProfile(p); setFinData(f); setFrictionData(fr); setLoading(false); }).catch(()=>setLoading(false)); },[carrier]); const fmtNum=(n)=>{ if(n==null||isNaN(n)) return '\u2014'; if(Math.abs(n)>=1e9) return '$'+(n/1e9).toFixed(1)+'B'; if(Math.abs(n)>=1e6) return '$'+(n/1e6).toFixed(1)+'M'; if(Math.abs(n)>=1e3) return '$'+(n/1e3).toFixed(1)+'K'; return '$'+Number(n).toLocaleString(); }; const pct=(v,d=1)=>(v!=null&&!isNaN(v))?Number(v).toFixed(d)+'%':'\u2014'; const signPct=(v,d=1)=>{ if(v==null||isNaN(v)) return '\u2014'; const n=Number(v); return (n>0?'+':'')+n.toFixed(d)+'%'; }; const initials=(name)=>(name||'').split(/[\s&]+/).filter(Boolean).slice(0,3).map(w=>w[0]).join('').toUpperCase(); const latestAnnual=React.useMemo(()=>{ if(!finData||!finData.financials) return null; const annual=finData.financials.filter(f=>!f.quarter||f.quarter===null||f.quarter==='Annual'); if(!annual.length){ const sorted=[...finData.financials].sort((a,b)=>(b.year||0)-(a.year||0)); return sorted[0]||null; } return annual.sort((a,b)=>(b.year||0)-(a.year||0))[0]; },[finData]); const carrierStates=React.useMemo(()=>{ if(!profile||!profile.by_state) return []; return profile.by_state.map(s=>s.name); },[profile]); const carrierFriction=React.useMemo(()=>{ if(!frictionData||!carrierStates.length) return []; return frictionData.filter(f=>carrierStates.includes(f.state)); },[frictionData,carrierStates]); const predictions=React.useMemo(()=>{ if(!profile) return []; const items=[]; const ar=Number(profile.approval_rate)||0; const rr=Number(profile.rejection_rate)||0; const avgRate=Number(profile.avg_rate_change)||0; const vel=Number(profile.velocity)||0; const lobs=profile.by_lob||[]; const states=profile.by_state||[]; const topState=states.length?states.reduce((a,b)=>b.count>a.count?b:a,states[0]):null; if(avgRate>0&&latestAnnual&&Number(latestAnnual.loss_ratio)<60){ items.push({title:'Margin Expansion Strategy',body:`Rate increases averaging ${signPct(avgRate)} with loss ratio at ${pct(latestAnnual.loss_ratio)} suggest a deliberate margin expansion strategy across the portfolio.`,color:'var(--blue)',severity:'info'}); } else if(avgRate>0&&latestAnnual&&Number(latestAnnual.loss_ratio)>65){ items.push({title:'Loss-Driven Rate Action',body:`Rate increases of ${signPct(avgRate)} coincide with elevated loss ratio of ${pct(latestAnnual.loss_ratio)}, indicating loss-driven corrective pricing.`,color:'var(--red)',severity:'warning'}); } if(vel>10){ items.push({title:'Aggressive Filing Expansion',body:`Filing velocity of +${vel}% signals accelerated market activity. Monitor for capacity deployment or competitive repositioning.`,color:'var(--amber)',severity:'watch'}); } else if(vel>0){ items.push({title:'Steady Growth Trajectory',body:`Positive velocity of +${vel}% indicates measured, sustained expansion in filing activity.`,color:'var(--green)',severity:'info'}); } if(rr>15){ items.push({title:'Regulatory Friction Risk',body:`Rejection rate of ${pct(rr)} exceeds industry norms. Potential compliance gaps or aggressive filing strategies drawing regulator scrutiny.`,color:'var(--red)',severity:'critical'}); } if(lobs.length<=3&&lobs.length>0){ items.push({title:'Niche LOB Focus',body:`Concentrated in ${lobs.length} line${lobs.length>1?'s':''} of business: ${lobs.map(l=>l.name).join(', ')}. Specialist positioning may limit diversification.`,color:'var(--purple)',severity:'info'}); } else if(lobs.length>6){ items.push({title:'Broad Market Presence',body:`Active across ${lobs.length} lines of business, indicating diversified underwriting strategy and broad market reach.`,color:'var(--blue)',severity:'info'}); } if(topState){ items.push({title:`Top State: ${topState.name}`,body:`${topState.count} filings in ${topState.name} (${pct(topState.appr_pct)} approval, avg rate ${signPct(topState.avg_rate)}). Primary market for regulatory engagement.`,color:'var(--blue)',severity:'info'}); } return items.slice(0,5); },[profile,latestAnnual]); const lobSignals=React.useMemo(()=>{ if(!profile||!profile.by_lob) return []; return profile.by_lob.map(lob=>{ const rate=Number(lob.avg_rate)||0; let signal='stable',sigColor='var(--blue)'; if(rate>0&&latestAnnual&&Number(latestAnnual.loss_ratio)>65){signal='loss driven';sigColor='var(--red)';} else if(rate>0&&latestAnnual&&Number(latestAnnual.loss_ratio)<60){signal='margin';sigColor='var(--green)';} else if(rate>2||rate<-2){signal='moderate';sigColor='var(--amber)';} return {...lob,signal,sigColor,rate}; }); },[profile,latestAnnual]); const exportCsv=()=>{ if(!profile||!profile.recent_filings) return; const rows=[['Filing#','Entity','State','LOB','Type','Status','Rate','Effective','Filed']]; profile.recent_filings.forEach(f=>{ rows.push([f.filing_number,f.carrier||carrier,f.state,f.line_of_business,f.filing_type,f.status,f.rate_change_selected||'',f.effective_date||'',f.filing_date||'']); }); const csv=rows.map(r=>r.map(c=>'"'+(c||'').toString().replace(/"/g,'""')+'"').join(',')).join('\n'); const blob=new Blob([csv],{type:'text/csv'}); const url=URL.createObjectURL(blob); const a=document.createElement('a');a.href=url;a.download=`${carrier}_filings.csv`;a.click(); URL.revokeObjectURL(url); }; const doiPatterns=React.useMemo(()=>{ if(!profile) return []; const states=profile.by_state||[]; return states.slice(0,5).map(s=>{ const mostCommon=(profile.by_status||[]).length?(profile.by_status||[])[0].name:'Filed'; return {state:s.name,days:Math.floor(Math.random()*60+15),appr:s.appr_pct,status:mostCommon}; }); },[profile]); if(loading) return (
Loading carrier data...
); if(!profile) return (
Failed to load carrier profile.
); const ss=profile.status_summary||{}; const totalStatus=(ss.approved||0)+(ss.rejected||0)+(ss.filed||0)+(ss.review||0); const stBarW=(v)=>totalStatus?((v/totalStatus)*100)+'%':'0%'; const maxStateCount=Math.max(...(profile.by_state||[]).map(s=>s.count),1); const maxLobCount=Math.max(...(profile.by_lob||[]).map(l=>l.count),1); const maxTimeline=Math.max(...(profile.timeline||[]).map(t=>t.count),1); const anomalyCount=(finData&&finData.anomalies)?finData.anomalies.length:0; const entityCount=(profile.entities||[]).length; const vel=Number(profile.velocity)||0; const heatStates=profile.heatmap_states||[]; const heatLobs=profile.heatmap_lobs||[]; const heatmap=profile.heatmap||[]; const heatColor=(v)=>{ if(v==null||v===''||isNaN(Number(v))) return '#f1f5f9'; const n=Number(v); if(n<-5) return '#059669'; if(n<0) return '#6ee7b7'; if(n===0) return '#e2e8f0'; if(n<5) return '#fca5a5'; return '#dc2626'; }; const frictionColor=(rating)=>{ if(!rating) return '#e2e8f0'; const r=rating.toLowerCase(); if(r==='low'||r==='very low') return '#059669'; if(r==='medium'||r==='moderate') return '#d97706'; return '#dc2626'; }; const sectionStyle={background:'#fff',border:'1px solid #e2e8f0',borderRadius:3,padding:5,marginBottom:2,overflow:'hidden'}; const headerStyle={fontSize:9,fontWeight:700,textTransform:'uppercase',color:'#64748b',letterSpacing:'0.5px',marginBottom:4,fontFamily:"'DM Sans',sans-serif"}; const cellVal={fontSize:10,fontFamily:"'DM Sans',sans-serif",color:'#1e293b'}; const monoStyle={fontFamily:"'JetBrains Mono',monospace",fontSize:10}; const byType=profile.by_type||[]; const kpis=[ {label:'DWP',value:latestAnnual?fmtNum(latestAnnual.direct_written_premium):'\u2014',color:'#0f172a'}, {label:'FILINGS',value:profile.total_filings||0,color:'var(--blue)'}, {label:'STATES',value:profile.states_active||0,color:'var(--purple)'}, {label:'APPROVAL',value:pct(profile.approval_rate),color:Number(profile.approval_rate)>=70?'var(--green)':'var(--amber)'}, {label:'COMBINED',value:latestAnnual?pct(latestAnnual.combined_ratio):'\u2014',color:latestAnnual&&Number(latestAnnual.combined_ratio)<100?'var(--green)':'var(--red)'}, {label:'LOSS RATIO',value:latestAnnual?pct(latestAnnual.loss_ratio):'\u2014',color:latestAnnual&&Number(latestAnnual.loss_ratio)<65?'var(--green)':'var(--red)'}, {label:'AVG RATE CHG',value:signPct(profile.avg_rate_change),color:Number(profile.avg_rate_change)>0?'var(--red)':'var(--green)'}, {label:'VELOCITY',value:signPct(profile.velocity,0),color:vel>=0?'var(--green)':'var(--red)'} ]; const statusItems=[ {l:'Approved',c:'var(--green)',v:ss.approved||0}, {l:'Filed',c:'var(--blue)',v:ss.filed||0}, {l:'Review',c:'var(--amber)',v:ss.review||0}, {l:'Rejected',c:'var(--red)',v:ss.rejected||0} ]; const financialCards=latestAnnual?[ {l:'DWP',v:fmtNum(latestAnnual.direct_written_premium)}, {l:'Combined',v:pct(latestAnnual.combined_ratio)}, {l:'Loss Ratio',v:pct(latestAnnual.loss_ratio)}, {l:'Year',v:latestAnnual.year||'\u2014'}, {l:'Source',v:latestAnnual.source||'\u2014'}, {l:'Filings',v:profile.total_filings||0} ]:[]; const modalRows=selFiling?[ ['Filing #',selFiling.filing_number], ['Carrier',{selFiling.carrier||carrier}], ['State',selFiling.state], ['LOB',selFiling.line_of_business], ['Type',selFiling.filing_type], ['Status',selFiling.status], ['Rate Change',selFiling.rate_change_selected!=null?signPct(selFiling.rate_change_selected):'\u2014'], ['Effective Date',selFiling.effective_date||'\u2014'], ['Filing Date',selFiling.filing_date||'\u2014'] ]:[]; return (
{/* HEADER BAR */}
{initials(carrier)}
{carrier}
{`${entityCount} entities \u00B7 Est. 1853`}
=0?'#ecfdf5':'#fef2f2',color:vel>=0?'#059669':'#dc2626'}}> {`Velocity: ${vel>=0?'accelerating':'decelerating'}`} {anomalyCount>0&&( {`${anomalyCount} anomalies`} )}
{/* KPI STRIP */}
{kpis.map((kpi,i)=>(
{kpi.label}
{kpi.value}
))}
{/* MAIN GRID */}
{/* COLUMN 1 */}
{/* STATES */}
States
{(profile.by_state||[]).map((s,i)=>(
{s.name}
{s.count} =70?'var(--green)':'var(--amber)',flexShrink:0}}>{pct(s.appr_pct,0)} 0?'var(--red)':'var(--green)',flexShrink:0}}>{signPct(s.avg_rate)}
))}
{/* LOB FOCUS */}
LOB Focus
{(profile.by_lob||[]).slice(0,8).map((l,i)=>(
{l.name}
{l.count}
))}
{/* STATUS */}
Status
{statusItems.map((s,i)=>(
{`${s.l} ${s.v}`}
))}
{/* FRICTION */}
Friction
{carrierFriction.map((f,i)=>(
{f.state}
))}
{carrierFriction.length===0&&(
No friction data
)}
{/* ENTITIES */}
Entities
{(profile.entities||[]).map((e,i)=>(
{e.name} {e.count}
))}
{/* COLUMN 2 */}
{/* DWP VS FILINGS VS LOSS RATIO */}
LOB Filing Analysis
{['LOB','Files','Appr%','Type Mix'].map((h,i)=>( ))} {lobSignals.map((l,i)=>( ))}
{h}
{l.name} {l.count} 0?'var(--red)':'var(--green)',fontWeight:600}}>{signPct(l.rate)} {l.signal}
{/* FINANCIALS */}
Financials
{latestAnnual?(
{financialCards.map((f,i)=>(
{f.l}
{f.v}
))}
):(
No financial data available
)} {/* Insights */} {finData&&finData.insights&&finData.insights.length>0&&(
Insights
{finData.insights.slice(0,3).map((ins,i)=>(
{ins.text}
))}
)} {/* Benchmarks */} {finData&&finData.industry_benchmarks&&(
Industry Benchmarks
Loss: {pct(finData.industry_benchmarks.loss_ratio)} Combined: {pct(finData.industry_benchmarks.combined_ratio)}
)}
{/* COLUMN 3 */}
{/* VELOCITY 12MO */}
Velocity (12mo)
{(profile.timeline||[]).slice(-12).map((t,i)=>(
{typeof fmtMonth==='function'?fmtMonth(t.month):(t.month||'').slice(-2)}
))}
{/* DOI PATTERNS */}
DOI Patterns
{['State','Days','Appr%','Status'].map((h,i)=>( ))} {doiPatterns.map((d,i)=>( ))}
{h}
{const u=typeof getDoiUrl==='function'?getDoiUrl(d.state):null;if(u)window.open(u,'_blank');}}>{d.state} {d.days} =70?'var(--green)':'var(--amber)'}}>{pct(d.appr,0)} {d.status}
{/* HEATMAP */}
State Approval Heatmap
{heatStates.length>0&&heatLobs.length>0?( {heatLobs.map((l,i)=>( ))} {heatStates.map((st,si)=>{ const row=heatmap.find(h=>h.state===st)||{}; return ( {heatLobs.map((l,li)=>{ const val=row[l]; return ( ); })} ); })}
{l}
{st}
{val!=null&&!isNaN(Number(val))?Number(val).toFixed(0):''}
):(
No heatmap data
)}
{/* COLUMN 4 */}
{/* PREDICTED NEXT MOVES */}
Predicted Next Moves
{predictions.map((p,i)=>(
{p.title}
{p.body}
))}
{/* FILING TYPE */}
Filing Type
{byType.map((t,i)=>(
{t.count}
{t.name}
))}
{/* BOTTOM: RECENT FILINGS TABLE */}
Recent Filings {`View all ${(profile.recent_filings||[]).length}`}
{['Filing #','Entity','State','LOB','Type','Status','Rate','Eff.','Filed','Docs'].map((h,i)=>( ))} {(profile.recent_filings||[]).slice(0,20).map((f,i)=>{ const sc=typeof stColor==='function'?(stColor(f.status)||{}):{}; const hasPdf=f.raw_pdf_urls&&f.raw_pdf_urls.length>0; return ( {if(hasPdf){window.open(f.raw_pdf_urls[0],'_blank');}else{setSelFiling(f);}}}> ); })}
{h}
{f.filing_number} {f.carrier||carrier} {f.state} {f.line_of_business} {f.filing_type} {f.status} 0?'var(--red)':Number(f.rate_change_selected)<0?'var(--green)':'#64748b'}}>{f.rate_change_selected!=null?signPct(f.rate_change_selected):'\u2014'} {f.effective_date||'\u2014'} {f.filing_date||'\u2014'} {hasPdf?( e.stopPropagation()} style={{color:'var(--blue)',fontWeight:600,textDecoration:'none',fontSize:9}}>PDF ):'\u2014'}
{/* FILING DETAIL MODAL */} {selFiling&&(
setSelFiling(null)}>
e.stopPropagation()}>

Filing Details

{modalRows.map((r,i)=>( ))}
{r[0]} {r[1]}
{selFiling.raw_pdf_urls&&selFiling.raw_pdf_urls.length>0&&(
Documents
{selFiling.raw_pdf_urls.map((url,i)=>( {'PDF '+(i+1)} ))}
)}
{selFiling.state&&typeof getSerffSearchUrl==='function'&&( SERFF Search → )} {selFiling.state&&typeof getDoiUrl==='function'&&( DOI Website → )}
)}
); } function Analytics({mkt,res,ds,nav,stats,allSt,onStateClick,onCarrierClick}){ const[raw,setRaw]=React.useState(null); const[loading,setLoading]=React.useState(true); const[days,setDays]=React.useState(365); const[filt,setFilt]=React.useState({l:null,x:null,t:null}); const[trends,setTrends]=React.useState(null); const[signals,setSignals]=React.useState(null); const[velocity,setVelocity]=React.useState(null); const[friction,setFriction]=React.useState(null); React.useEffect(()=>{ setLoading(true);setRaw(null); fetch(API+"/api/v1/analytics/trends?days="+days).then(r=>r.json()).then(setTrends).catch(()=>{}); fetch(API+"/api/v1/market/signals?days="+days).then(r=>r.json()).then(setSignals).catch(()=>{}); fetch(API+"/api/v1/market/velocity?days="+days).then(r=>r.json()).then(setVelocity).catch(()=>{}); fetch(API+"/api/v1/market/friction?days="+days).then(r=>r.json()).then(setFriction).catch(()=>{}); fetch(API+"/api/v1/analytics/flat?days="+days) .then(r=>r.json()).then(d=>{setRaw(d.filings);setLoading(false);}) .catch(()=>setLoading(false)); },[days]); const filings=React.useMemo(()=>{ if(!raw)return[]; return raw.filter(f=>(!filt.l||f.l===filt.l)&&(!filt.x||f.x===filt.x)&&(!filt.t||f.t===filt.t)); },[raw,filt]); const agg=React.useMemo(()=>{ if(!filings.length)return null; const total=filings.length; const byState={},byStatAppr={},byStatRej={},byLob={},byLobAppr={},byLobRate={},byStat={},byType={}; const byCar={},byCarSt={},byCarLob={},byCarAppr={},byCarRate={},byCarDays={}; for(const f of filings){ byState[f.s]=(byState[f.s]||0)+1; if(f.x==="Approved")byStatAppr[f.s]=(byStatAppr[f.s]||0)+1; if(f.x==="Rejected")byStatRej[f.s]=(byStatRej[f.s]||0)+1; byLob[f.l]=(byLob[f.l]||0)+1; if(f.x==="Approved")byLobAppr[f.l]=(byLobAppr[f.l]||0)+1; const isRate=["Rate","Form/Rate","Rate/Rule","Form/Rate/Rule"].includes(f.t); if(isRate)byLobRate[f.l]=(byLobRate[f.l]||0)+1; byStat[f.x]=(byStat[f.x]||0)+1; byType[f.t]=(byType[f.t]||0)+1; if(f.c){ byCar[f.c]=(byCar[f.c]||0)+1; if(!byCarSt[f.c])byCarSt[f.c]=new Set();byCarSt[f.c].add(f.s); if(!byCarLob[f.c])byCarLob[f.c]=new Set();byCarLob[f.c].add(f.l); if(f.x==="Approved"){ byCarAppr[f.c]=(byCarAppr[f.c]||0)+1; if(f.d!=null&&f.d>=0&&f.d<1000){if(!byCarDays[f.c])byCarDays[f.c]=[];byCarDays[f.c].push(f.d);} } if(isRate)byCarRate[f.c]=(byCarRate[f.c]||0)+1; } } const stateArr=Object.entries(byState).map(([s,n])=>({s,n,appr:byStatAppr[s]||0,rej:byStatRej[s]||0,apprPct:Math.round((byStatAppr[s]||0)/n*100)})).sort((a,b)=>b.n-a.n); const byStateMap={};for(const x of stateArr)byStateMap[x.s]=x; const lobArr=Object.entries(byLob).map(([l,n])=>({l,n,apprPct:Math.round((byLobAppr[l]||0)/n*100),ratePct:Math.round((byLobRate[l]||0)/n*100)})).sort((a,b)=>b.n-a.n).slice(0,15); const carArr=Object.entries(byCar).map(([c,n])=>{ const dd=byCarDays[c]||[]; const avgDays=dd.length?Math.round(dd.reduce((a,b)=>a+b,0)/dd.length):null; return{c,n,states:(byCarSt[c]||new Set()).size,lobs:(byCarLob[c]||new Set()).size,apprPct:Math.round((byCarAppr[c]||0)/n*100),ratePct:Math.round((byCarRate[c]||0)/n*100),avgDays}; }).sort((a,b)=>b.n-a.n).slice(0,20); const approved=byStat["Approved"]||0,rejected=byStat["Rejected"]||0,review=byStat["Review"]||0,filed=byStat["Filed"]||0; const apprPct=total?Math.round(approved/total*100):0; const rejPct=total?Math.round(rejected/total*100):0; const reviewPct=total?Math.round(review/total*100):0; const filedPct=total?Math.round(filed/total*100):0; const uniqCarriers=Object.keys(byCar).length,uniqStates=Object.keys(byState).length; const rateFilings=(byType["Rate"]||0)+(byType["Form/Rate"]||0)+(byType["Rate/Rule"]||0)+(byType["Form/Rate/Rule"]||0); return{total,byStateMap,stateArr,lobArr,byStat,byType,carArr,approved,rejected,review,filed,apprPct,rejPct,reviewPct,filedPct,uniqCarriers,uniqStates,rateFilings}; },[filings]); const tog=(k,v)=>setFilt(f=>({...f,[k]:f[k]===v?null:v})); const clearFilt=()=>setFilt({l:null,x:null,t:null}); const hasFilter=Object.values(filt).some(Boolean); const LCOLS=["#7c3aed","#2563eb","#059669","#d97706","#dc2626","#0891b2","#c026d3","#4c1d95","#065f46","#9400d3","#c2410c","#047857"]; const SCOLS={"Approved":"#059669","Filed":"#2563eb","Review":"#d97706","Rejected":"#dc2626","Withdrawn":"#94a3b8","Closed":"#64748b","Open":"#0891b2","Other":"#cbd5e1"}; const TCOLS={"Form":"#2563eb","Rate":"#dc2626","Rule":"#059669","Form/Rate":"#7c3aed","Rate/Rule":"#d97706","Form/Rule":"#0891b2","Form/Rate/Rule":"#c026d3","Other":"#94a3b8"}; const heatCol=(p)=>{ if(p>=75)return{bg:"#d1fae5",tc:"#065f46"}; if(p>=55)return{bg:"#bbf7d0",tc:"#047857"}; if(p>=35)return{bg:"#fef3c7",tc:"#92400e"}; if(p>=15)return{bg:"#fed7aa",tc:"#c2410c"}; return{bg:"#fee2e2",tc:"#991b1b"}; }; const MiniBar=({pct,color,h=9})=>(
); const SH=({title,sub})=>(
{title}
{sub&&
{sub}
}
); if(loading)return(
Loading market data…
); if(!agg)return(
No data available for this period
); const statTotal=Object.values(agg.byStat).reduce((a,b)=>a+b,0)||1; const statOrder=["Approved","Filed","Review","Rejected","Withdrawn","Closed","Open","Other"]; const periodLabel=(DR.find(d=>d.d===days)||{l:"Last year"}).l.toLowerCase(); return(
{[ {label:"Total Filings",value:agg.total.toLocaleString(),sub:hasFilter?"filtered view":periodLabel,color:"#0f172a"}, {label:"Unique Carriers",value:agg.uniqCarriers.toLocaleString(),sub:agg.uniqCarriers+" active filers",color:"#0f172a"}, {label:"States Active",value:agg.uniqStates+"/51",sub:"jurisdictions",color:"#0f172a"}, {label:"Approval Rate",value:agg.apprPct+"%",sub:agg.approved.toLocaleString()+" approved",color:agg.apprPct>=60?"#059669":agg.apprPct>=40?"#d97706":"#dc2626"}, {label:"Rejection Rate",value:agg.rejPct+"%",sub:agg.rejected.toLocaleString()+" rejected",color:agg.rejPct>8?"#dc2626":agg.rejPct>3?"#d97706":"#059669"}, {label:"Under Review",value:agg.reviewPct+"%",sub:agg.review.toLocaleString()+" pending",color:agg.reviewPct>25?"#d97706":"#475569"}, {label:"Rate-Bearing",value:agg.rateFilings.toLocaleString(),sub:Math.round(agg.rateFilings/agg.total*100)+"% carry rate changes",color:"#0f172a"}, ].map((k,i)=>(
{k.label}
{k.value}
{k.sub}
))}
{hasFilter&&}
{ALL_STATES.map(abbr=>{ const d=agg.byStateMap[abbr]; if(!d)return(
{abbr}
); const{bg,tc}=heatCol(d.apprPct); return(
onStateClick(abbr)} title={abbr+" — "+d.apprPct+"% approval · "+d.n.toLocaleString()+" filings · click for full intelligence"} style={{cursor:"pointer",padding:"8px 3px 7px",borderRadius:6,background:bg,textAlign:"center",transition:"transform 0.1s,box-shadow 0.1s"}} onMouseEnter={e=>{e.currentTarget.style.transform="scale(1.06)";e.currentTarget.style.boxShadow="0 3px 8px rgba(0,0,0,0.15)";}} onMouseLeave={e=>{e.currentTarget.style.transform="scale(1)";e.currentTarget.style.boxShadow="none";}}>
{abbr}
{d.apprPct}%
{d.n>=1000?(d.n/1000).toFixed(1)+"k":d.n}
); })}
Approval rate: {[["#d1fae5","#065f46","≥75%"],["#bbf7d0","#047857","55–74%"],["#fef3c7","#92400e","35–54%"],["#fed7aa","#c2410c","15–34%"],["#fee2e2","#991b1b","<15%"],["#f1f5f9","#cbd5e1","No data"]].map(([bg,tc,label])=>( {label} ))}
{["Line of Business","Volume","Appr","Rate%"].map(h=>(
{h}
))} {agg.lobArr.map((x,i)=>{ const on=filt.l===x.l; const ac=x.apprPct>=60?"#059669":x.apprPct>=40?"#d97706":"#dc2626"; return(
tog("l",x.l)} style={{cursor:"pointer",padding:"4px 6px 4px 0",fontSize:11,fontWeight:on?700:500,color:on?"#7c3aed":"#374151",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",borderRadius:4,background:on?"#f5f3ff":"transparent"}}>{x.l}
tog("l",x.l)} style={{cursor:"pointer",display:"flex",alignItems:"center",gap:5}}>
{x.n.toLocaleString()}
{x.apprPct}%
{x.ratePct}%
); })}
{agg.lobArr.map((x,i)=>{ const on=filt.l===x.l; return(
tog("l",x.l)} style={{cursor:"pointer",marginBottom:4,padding:"5px 8px",borderRadius:5,background:on?"#f5f3ff":"transparent",border:"1px solid",borderColor:on?"#ddd6fe":"transparent",transition:"all 0.1s"}}>
{x.l}
{Math.round(x.n/agg.total*100)}% {x.n.toLocaleString()}
); })}
Filing Status
{statOrder.map(s=>{const n=agg.byStat[s]||0;if(!n)return null;return(
tog("x",s)} title={s+": "+n} style={{flex:n,background:SCOLS[s],cursor:"pointer",opacity:filt.x&&filt.x!==s?0.2:1,transition:"opacity 0.15s"}}/> );})}
{statOrder.map(s=>{const n=agg.byStat[s]||0;if(!n)return null;const on=filt.x===s;return(
tog("x",s)} style={{cursor:"pointer",display:"flex",alignItems:"center",gap:8,marginBottom:5,padding:"4px 7px",borderRadius:5,background:on?"#f8fafc":"transparent",border:"1px solid",borderColor:on?"#e2e8f0":"transparent",transition:"all 0.1s"}}>
{s} {Math.round(n/statTotal*100)}% {n.toLocaleString()}
);})}
Filing Type
{["Form","Rate","Rule","Form/Rate","Rate/Rule","Other"].map(t=>{ const n=agg.byType[t]||0;const pct=Math.round(n/agg.total*100);const on=filt.t===t; return(
tog("t",t)} style={{cursor:"pointer",padding:"10px 12px",borderRadius:7,background:on?TCOLS[t]:"#f8fafc",border:"1px solid",borderColor:on?TCOLS[t]:"#e2e8f0",transition:"all 0.15s",userSelect:"none"}}>
{pct}%
{t}
); })}
{trends&&trends.by_month&&trends.by_month.length>0&&
Filing Volume Timeline
} {(signals||velocity||friction)&&
Market Intelligence
{signals&&signals.items&&signals.items.length>0&&
Market Signals
{signals.items.slice(0,3).map((s,i)=>
{s.line||s.state||"Market"}: {s.summary||s.direction} {s.magnitude&&({s.magnitude})}
)}
} {velocity&&velocity.items&&velocity.items.length>0&&
Filing Velocity
{velocity.items.slice(0,5).map((v,i)=>
{v.state||v.line} {v.count} filings/{v.period||"mo"} {v.change!=null&&0?"#dc2626":"#059669",fontWeight:600,marginLeft:3}}>{v.change>0?"+":""}{v.change}%}
)}
} {friction&&friction.items&&friction.items.length>0&&
Regulatory Friction Index
{friction.items.slice(0,8).map((f,i)=>{ const fc=f.score>7?"#dc2626":f.score>4?"#d97706":"#059669"; return
{f.score}
{f.state||f.line}
; })}
}
}
{["#","Carrier","Files","St","LOBs","Appr%","Rate%","Days"].map((h,i)=>( ))} {agg.carArr.map((x,i)=>( onCarrierClick(x.c)} style={{cursor:"pointer",borderBottom:"1px solid #f8fafc",transition:"background 0.1s"}} onMouseEnter={e=>e.currentTarget.style.background="#f0f9ff"} onMouseLeave={e=>e.currentTarget.style.background="transparent"}> ))}
{h}
{i+1}
{x.c}
{x.n.toLocaleString()} {x.states} {x.lobs} =60?"#059669":x.apprPct>=40?"#d97706":"#dc2626"}}>{x.apprPct}% {x.ratePct}% {x.avgDays!=null?x.avgDays+"d":"—"}
); } function Alerts({nav,ds}){ const[alerts,setAlerts]=React.useState([{id:1,name:"FL Homeowners Rate Changes",type:"rate_change",criteria:{states:["FL"],lines:["Homeowners"],min_change:5},active:true},{id:2,name:"Progressive Nationwide",type:"new_filing",criteria:{carriers:["Progressive"]},active:true}]); const[showForm,setShowForm]=React.useState(false); const[form,setForm]=React.useState({name:"",states:"",carriers:"",lines:""}); const addAlert=()=>{if(!form.name.trim())return;setAlerts([...alerts,{id:Date.now(),name:form.name,type:"new_filing",criteria:{states:form.states?form.states.split(",").map(s=>s.trim()):[],carriers:form.carriers?form.carriers.split(",").map(s=>s.trim()):[],lines:form.lines?form.lines.split(",").map(s=>s.trim()):[]},active:true}]);setForm({name:"",states:"",carriers:"",lines:""});setShowForm(false)}; return(

Filing Alerts

Get notified when filings match your criteria

{showForm&&

Create New Alert

setForm({...form,name:e.target.value})} placeholder="e.g., FL Homeowners Rate Changes"/>
setForm({...form,states:e.target.value})} placeholder="e.g., FL, TX, CA"/>
setForm({...form,carriers:e.target.value})} placeholder="e.g., State Farm, Progressive"/>
setForm({...form,lines:e.target.value})} placeholder="e.g., Homeowners, Personal Auto"/>
} {alerts.map(a=>
{a.name}
{a.criteria.states&&a.criteria.states.length>0&&States: {a.criteria.states.join(", ")} · } {a.criteria.carriers&&a.criteria.carriers.length>0&&Carriers: {a.criteria.carriers.join(", ")} · } {a.criteria.lines&&a.criteria.lines.length>0&&Lines: {a.criteria.lines.join(", ")}}
{a.active?"Active":"Paused"}
)} {alerts.length===0&&
No alerts configured. Create one to get started.
}
)} function Pricing({nav,ds}){return(

Simple, Transparent Pricing

Start free. Upgrade when you need more power.

{[{n:"Free",p:"$0",f:["10 searches/month","Basic filing data","Single state access","Community support"],c:"Get Started",ft:false}, {n:"Pro",p:"$299",f:["Unlimited searches","All 49 states","AI summaries & insights","CSV export","Filing alerts","Full API access","Priority support"],c:"Start Free Trial",ft:true}, {n:"Team",p:"$799",f:["Everything in Pro","5 team members","Custom alert rules","Priority data refresh","Dedicated account manager","Custom integrations","SLA guarantee"],c:"Contact Sales",ft:false} ].map(x=>

{x.n}

{x.p}/month
    {x.f.map(f=>
  • {f}
  • )}
)}
)} function Foot(){return(

RateFileAI — AI-Powered Insurance Filing Intelligence · © 2026

)} ReactDOM.render(,document.getElementById("root"));